home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / Tools / TWILIGHT / TL_SOURC.E / ASSEMBLE.R / BEISPIEL.S next >
Encoding:
Text File  |  1994-10-19  |  12.5 KB  |  286 lines

  1. ; ***************************************
  2. ; Beispielmodul für TwiLight in Assembler.
  3. ; Kann als Grundbaustein für eigene Module genutzt werden.
  4. ;
  5. ; Geschrieben mit dem TurboAss von Σ-Soft.
  6. ; Wenn die Assembler-Direktiven "(END)PART", "DEFAULT" und "OUTPUT"
  7. ; entfernt werden, müsste sich das Modul mit allen Assemblern
  8. ; übersetzen lassen.
  9. ;
  10. ; Delirium Arts '93
  11. ;
  12.  
  13.  
  14.  
  15.                 OUTPUT 'C:\TLM\DEMO.TLM' ; Modul wird in den Ordner TLM als DEMO.TLM gespeichert
  16.                 DEFAULT 5       ; Ausgabe mit Fastload-Bit (dieses wird aber von TwiLight sowieso ignoriert)
  17.  
  18.                 >PART 'ACC-Struktur-EQUs'
  19. _tl_version     EQU 0           ; die infos, die das ACC liefert...
  20. _tl_handle      EQU 2           ; siehe Doku!
  21. _max_x          EQU 4           ; maximale Bildschirmkoordinaten
  22. _max_y          EQU 6
  23. _vscr_x         EQU 8           ; sichtbarer Bildschirmausschnitt
  24. _vscr_y         EQU 10          ;  besser vscr_... verwenden!
  25. _vscr_w         EQU 12
  26. _vscr_h         EQU 14
  27. _max_colors     EQU 16          ; maximale Farbanzahl
  28. _palette        EQU 18          ; aus welcher Palette
  29. _planes         EQU 20          ; Anzahl der Farbplanes
  30. _raster_op      EQU 22          ; Anzahl der Rasterops/sek
  31. _cpu            EQU 24          ; Prozessor-cookie
  32. _fpu            EQU 28          ; Coprotz
  33. _mch            EQU 32          ; Maschinencookie
  34. _snd            EQU 36          ; Soundcookie
  35. _tl_screen_flag EQU 40          ; Zeiger auf Flag, ob noch geschont werden soll (nur wenn bit 12 in tlm_flags gesetzt!)
  36. _tl_path        EQU 44          ; Zeiger auf den \TLM\ Ordner (nullterminiert)
  37. _tl_screen_adr  EQU 48          ; Adresse des (evntl.) gesicherten Bildschirms
  38. _tl_mem         EQU 52          ; die mit tlm_mem_request angeforderte Speicher
  39. _tl_aes_global  EQU 56          ; Die AES-Kennung, bei jedem AES aufruf sollte sie benutzt werden.
  40. _tl_vdi_pb      EQU 60          ; Zeiger auf den VDI-Parameterblock von TwiLight. Eigentlich unnötig
  41. _tl_flags       EQU 64          ; Flags
  42. _tl_check       EQU 66          ; Die tl_check() routine
  43. _tl_dim_col     EQU 70          ; dunkelt Farben ab
  44. _tl_mod_time    EQU 74          ; liefert Zeit seit Modulstart
  45. _tl_set_col     EQU 78          ; Setzt bestimmte anzahl von VDI Farben
  46. _tl_scrn_restore EQU 82         ; Routine restauriert auf Wunsch den Bildschirm
  47. _tl_wait        EQU 86          ; Wartet bestimmte Zeit
  48. _tl_snd_play    EQU 90          ; Spielt Digi-Sound
  49. _tl_snd_stop    EQU 94          ; Stopt Digi-Sound
  50. _tl_paula       EQU 98          ; Spielt Sound mit PAULA.ACC
  51. _tl_reserved2   EQU 102
  52. _tl_play_mouse  EQU 110         ; Übergibt die Mauskontrolle an das Modul
  53. _tl_scroll      EQU 114         ; Zeigt Scrolline an
  54. _tl_xset_col    EQU 118         ; Setzt VDI-Farben in abhängigkeit vom Pixelmuster
  55. _tl_dither      EQU 122         ; Rastert ein farbiges Sprite für Schwarz-Weiß
  56. _tl_sprite_init EQU 126         ; Initialisiert die Spriteroutine
  57. _tl_sprite      EQU 130         ; Zeichnet ein Sprite
  58.  
  59.  
  60. RAHMEN          EQU 0           ; Die EQUs der Modulobjekte
  61. STRING          EQU 1
  62. BUTTON          EQU 2
  63. RADIO           EQU 3
  64. POPUP           EQU 4
  65. SLIDER          EQU 5
  66. ICON            EQU 6
  67. EX_BUTTON       EQU 10
  68. POPUP_2         EQU 11
  69. FREI            EQU 12
  70.  
  71.  
  72.  
  73.  
  74.                 ENDPART
  75.                 >PART 'Modulkopf'
  76.  
  77.                 bra     modulstart      ; muß ein 4-Byte-Sprung sein!
  78.  
  79. tlm_macic:      DC.B "XTLM"     ; Magic
  80. tlm_version:    DC.W $0001      ; Version des Moduls: 0.1
  81. tlm_min_acc:    DC.W 0          ; läuft auf allen TwiLight-Versionen
  82. tlm_name:       DC.B 'Demomodul               ' ; Modulname (24 Zeichen)
  83. tlm_author:     DC.B 'Delirium Arts           ' ; Name des Programmierers
  84. tlm_icon:       DC.L %11111111111111111111111111111111
  85.                 DC.L %11111111111111111111111111111111
  86.                 DC.L %11111111111111111111111111111111
  87.                 DC.L %11111100000000000000000000111111
  88.                 DC.L %11111100000000000000000000111111
  89.                 DC.L %11111100000000000000000000111111
  90.                 DC.L %11111100000000000000000000111111
  91.                 DC.L %11111100000000000000000000111111
  92.                 DC.L %11111100001111111111100000111111
  93.                 DC.L %11111100001111111111100000111111
  94.                 DC.L %11111100001111111111100000111111
  95.  
  96.                 DC.L %11111100001111111111100000111111
  97.                 DC.L %11111100001111111111100000111111
  98.                 DC.L %11111100001111111111100000111111
  99.                 DC.L %11111100001111111111100000111111
  100.                 DC.L %11111100001111111111100000111111
  101.                 DC.L %11111100001111111111100000111111
  102.                 DC.L %11111100000000000000000000111111
  103.                 DC.L %11111100000000000000000000111111
  104.                 DC.L %11111100000000000000000000111111
  105.                 DC.L %11111100000000000000000000111111
  106.                 DC.L %11111111111111111111111111111111
  107.                 DC.L %11111111111111111111111111111111
  108.                 DC.L %11111111111111111111111111111111
  109.  
  110. tlm_mem_req:    DC.L 0          ; Speicheranforderung... Das Modul braucht keinen zusätzlichen Speicher
  111. tlm_flags:      DC.W %0000000000111111 ; Flags
  112. ;                          ||| |||||||
  113. ;                          ||| ||||||+  Verändert Bildschirminhalt
  114. ;                          ||| |||||+-  Verändert Farben
  115. ;                          ||| ||||+--  Modul benötigt VSYNCs
  116. ;                          ||| |||+---  Maus soll ausgeschaltet werden
  117. ;                          ||| ||+----  TwiLight soll den Schirm abdunkeln
  118. ;                          ||| |+-----  TwiLight soll den Schirm löschen
  119. ;                          ||| +------  Modul benötigt die Spriteroutine
  120. ;                          |||
  121. ;                          ||+--------  Benötigt mindestens MC68020
  122. ;                          |+---------  Benötigt einen mathematischen Coproz.
  123. ;                          +----------  Modul benötigt DMA Sound
  124.  
  125. tlm_konfig:     DC.L objekte    ; Zeiger auf den Modulkonfigblock
  126.  
  127. ; Die folgenden Objekte können irgendwo im Modul stehen
  128. ; Hier stehen sie direkt nach dem Modulkopf.
  129.  
  130.  
  131. objekte:        DC.W ob_ende-objekte ; Länge des Objektblocks
  132.                 DC.L 0
  133.                 DC.L infotext
  134.                 DC.W 4          ; Es gibt 4 verschiedene Objekte (Knöpfe, Popup etc)
  135.                 DC.L _slider
  136.                 DC.L _rahmen
  137.                 DC.L _button
  138.                 DC.L _radio
  139.  
  140.  
  141. _slider:        DC.W SLIDER     ; Dieses Objekt ist ein Slider
  142.                 DC.W %0000000000000011 ; Der Slider ist horizontal und ist Tastaturbedienbar
  143.                 DC.L slider_routine ; diese Routine wird bei jeder Bewegung des Sliders aufgerufen
  144. w_slider:       DC.W 1          ; Die Aktuelle Einstellung des Sliders
  145.                 DC.W 1,1        ; Position
  146.                 DC.W 28         ; breite
  147.                 DC.W 10         ; 10 Elemente
  148.                 DC.W 1          ; Stepweite ist 1
  149.                 DC.W 1          ; kleinstes Element
  150.                 DC.W 10         ; größtes Element
  151.                 DC.L sl_mask    ; Zeiger auf Slidermaske
  152.                 DC.L sl_text    ; Zeiger auf den Slidertext
  153.  
  154. sl_mask:        DC.B "__ Objekte",0 ; Die Maske im Slider
  155. sl_text:        DC.B "          ",0 ; hier muß soviel Platz sein, wie der Text im Slider lang sein kann
  156.                 EVEN
  157.  
  158.  
  159.  
  160.  
  161. _button:        DC.W BUTTON     ; es soll ein Button sein
  162.                 DC.W 0          ; Flags, es ist ein Button mit Kästchen davor
  163.                 DC.L 0          ; optionale Routine (fehlt hier)
  164. w_button:       DC.W 0          ; der Status des Button 0-> nicht selectiert, -1 -> selectiert
  165.                 DC.W 1          ; x-Position
  166.                 DC.W 13         ; y-Position
  167.                 DC.L button_txt ; Zeiger auf den Buttonstring
  168.  
  169. button_txt:     DC.B ' [Drück mich ',0
  170.                 EVEN
  171.  
  172.  
  173.  
  174.  
  175.  
  176. _radio:         DC.W RADIO
  177.                 DC.W 0          ; Flags: Es sollen Runde Knöpfe sein
  178.                 DC.L 0          ; optionale Routine
  179. w_radio:        DC.W 1          ; Nr. des selectierten Knopfs
  180.                 DC.W 1,3        ; Position des Radioknopfs
  181.                 DC.W 0          ; Abstand 2er Knöpfe in x-Richtung
  182.                 DC.W 2          ; Abstand in y-Richtung zweier Knöpfe
  183.                 DC.W 3          ; 3 Knöpfe gibt's
  184.                 DC.L radio_txt1 ; Zeiger auf die 3 Einträge
  185.                 DC.L radio_txt2
  186.                 DC.L radio_txt3
  187.  
  188. radio_txt1:     DC.B '[Knopf 1',0 ; die Knöpfe
  189. radio_txt2:     DC.B 'K[nopf 2',0
  190. radio_txt3:     DC.B 'Kn[opf 3',0
  191.                 EVEN
  192.  
  193.  
  194.  
  195.  
  196.  
  197. _rahmen:        DC.W RAHMEN     ; Ein Rahmen
  198.                 DC.W 0,9        ; Position des Rahmens
  199.                 DC.W 32,3       ; Breite und Höhe
  200.                 DC.L rahmen_txt ; Der Text im Kopf des Rahmens
  201.                 DC.W 1          ; der Rahmen hat 1 Unterobjekt
  202.                 DC.L _popup
  203. rahmen_txt:     DC.B ' Überschrift ',0
  204.                 EVEN
  205.  
  206.  
  207. _popup:         DC.W POPUP      ; Ein Popup
  208.                 DC.W 0          ; Flags. Ein Normales Popup
  209.                 DC.L 0          ; keine Routine
  210. w_popup:        DC.W 1          ; der erste Knopf ist selectiert
  211.                 DC.W 2,1        ; Position des Popups
  212.                 DC.L pop_txt1   ; Zeiger auf den Titel des Popups
  213.                 DC.W 3          ; Popup hat 3 Einträge
  214.                 DC.L pop_txt2   ; Zeiger auf die Popuptexte
  215.  
  216. pop_txt1:       DC.B '[Popup: ',0
  217.  
  218. pop_txt2:       DC.B '  Eintrag 1 ',0 ; Die 3 Popupeinträge
  219.                 DC.B '  Eintrag 2 ',0
  220.                 DC.B '  Eintrag 3 ',0
  221.                 EVEN
  222.  
  223. ob_ende:        DC.L -1         ; Endflag
  224.  
  225. ; Der Infotext:
  226. ; Jede Zeile muß mit einem CR (13) abgeschlossen sein. Zwei oder mehrere
  227. ; CRs hintereinander bedeuten Leerzeilen.
  228. ; Die letzte Zeile muß mit 13,0 aufhören.
  229.  
  230. infotext:       DC.B 'DEMO-Modul',13,13
  231.                 DC.B 'Dies ist lediglich ein,',13
  232.                 DC.B 'Beispielmodul in Assembler.',13,13
  233.                 DC.B 'Sollte es Ihr Lieblingsmodul werden,',13
  234.                 DC.B 'schreiben Sie uns bitte.',13
  235.                 DC.B 'Wir werden uns dann ärgern,',13
  236.                 DC.B 'warum wir nicht nur',13
  237.                 DC.B 'solch billige Module geschrieben haben...',13,0
  238.  
  239.                 EVEN
  240.  
  241.  
  242. slider_routine: cmpi.w  #1,w_slider     ; Ist es nur noch '1 Objekt'
  243.                 bne.s   mehr_objekte
  244.                 move.b  #" ",sl_text+8  ; In Text das 'e' von 'Objekte' löschen
  245. mehr_objekte:   rts
  246.  
  247.                 ENDPART
  248.  
  249. ;--------------  MODUL ----------------------------------
  250.  
  251.                 >PART 'Das Modul'
  252. ; Hier kommt das eigentliche Modul.
  253. ; Das Modul sollte regelmäßig tl_check() aufrufen, um zu erfahren, ob noch weitergeschont werden soll.
  254. ; Das folgende Beispielmodul macht eigentlich nichts.
  255. ; Es testet einmal mit tl_check, ob noch geschont werden soll,
  256. ; Dann geht es in eine Schleife, wo jeweils mit tl_wait() 2 Sekunden gewartet wird.
  257.  
  258. modulstart:     move.l  SP,stackpuffer  ; der Stackpuffer wird gesichert und erst in der
  259. ;                                         in der Routine Ende für's zurück
  260. ;                                         springen wieder restauriert. Damit kann
  261. ;                                         man dann auch aus verschachtelten Unterroutinen
  262. ;                                         jederzeit beim Schonende zurückspringen
  263.                 movea.l 4(SP),A0        ; Holt die Adresse der tl_info-structur
  264.                 movea.l _tl_check(A0),A1 ; Adresse der TL_CHECK-Routine
  265.                 movea.l _tl_wait(A0),A2 ; Adresse von tl_wait
  266.                 jsr     (A1)            ; Soll noch geschont werden? Gleichzeitig wird hier auf einen VSYNC gewartet (Siehe Modulkopf)
  267.                 bmi.s   ende            ; In D0 ist der Rückgabewert, gleichzeitig wird aber auch das N-Flag entsprechend gesetzt
  268. ;                                         Daher kann man sich einen Test sparen.
  269.  
  270. schleife:       move.w  #20,-(SP)       ; 20 zehntel-Sekunden warten
  271.                 jsr     (A2)            ; tl_wait aufrufen
  272.                 bmi.s   ende            ; Auch wieder in D0 und N-Flag Rückgabewert
  273.                 addq.l  #2,SP           ; Stackkorrektur
  274.                 bra.s   schleife
  275.  
  276.  
  277.  
  278. ende:           movea.l stackpuffer(PC),SP ; Stack wieder restaurieren
  279.                 moveq   #0,D0           ; Rückgabewert des Moduls, alles OK
  280.                 rts                     ; und zurückspringen
  281.                 ENDPART
  282.  
  283.                 BSS
  284. stackpuffer:    DS.L 1          ; Zwischenspeicher für den Stack
  285.                 END
  286.